import axios from "axios";
import store from '@/store/'
import JSONbig from 'json-bigint'
import {Toast} from 'vant'
import router from '@/router/'


const refreshTokenReq = axios.create({
  baseURL:'http://ttapi.research.itcast.cn/'
})

const request = axios.create({
  baseURL:'http://ttapi.research.itcast.cn/'
})
request.defaults.transformResponse = [function (data) {
  try {
    return JSONbig.parse(data)
  } catch (err) {
    return {}
  }
}]

request.interceptors.request.use(function(config){
  const {user} = store.state
  if(user){
    config.headers.Authorization = `Bearer ${user.token}`
  }

  return config
}, function(err) {
  return Promise.reject(err)
})

request.interceptors.response.use(function(response){


  return response
}, async function(error) {
  const status = error.response.status
  if(status === 400){     //前端请求参数错误
    Toast.fail('客户端请求参数异常')
  }else if (status === 401){  //token无效
    // 1、如果没有token或者user.token直接跳转到登录页
    const {user} = store.state
    if(!user || !user.token) {
      return redirectLogin()
    }
    //2、使用refresh_token获取新的token，使用新的axios实例对象防止拦截器的影响，不然会一直循环
    try {
      const {data} = await refreshTokenReq({
        method:'PUT',
        url:'/app/v1_0/authorizations',
        headers:{
          Authorization:`Bearer ${user.refresh_token}`
        }
      })
        //3、拿到新的token之后把他更新到容器（vux）中，再获取新的token
        user.token = data.data.token
        store.commit('setUser', user)

        //4、！！！（重点）把失败的请求重新发出去，error.config是本次请求的相关配置对象
        return request(error.config)
    } catch (err) {
      redirectLogin()
    }



  }else if(status === 403){   //没有操作权限
    Toast.fail('没有权限操作')
  }else if(status >=500){    //后端异常
    Toast.fail('服务端异常，请稍后重试')
  }


  return Promise.reject(err)
})


function redirectLogin(){
  router.replace({
    name:'login',
    query:{
      redirect:router.currentRouter.fullPath
    }
  })
}

export default request